/********************************************************************************
  * \file      startup.s
  * \brief     Startup file for Kinetis L (KL25Z).
  *            This module performs:
  *                - Set the initial SP
  *                - Set the initial PC == __thumb_startup,
  *                - Branches to main in the C library (which eventually
  *                  calls main()).
  ******************************************************************************/
  .syntax unified
  .cpu cortex-m4
  .thumb

.global g_pfnVectors
.global Default_Handler

/* start address for the initialization values of the .data section. defined in linker script */
.word ___ROM_AT
/* start address for the .data section. defined in linker script */
.word _sdata
/* end address for the .data section. defined in linker script */
.word _edata
/* start address for the .bss section. defined in linker script */
.word __START_BSS
/* end address for the .bss section. defined in linker script */
.word __END_BSS

/**
 * \brief  This is the code that gets called when the processor first
 *          starts execution following a reset event. Only the absolutely
 *          necessary set is performed, after which the application
 *          supplied main() routine is called.
 * \param  None
 * \retval : None
*/
  .section .text.__thumb_startup
  .weak __thumb_startup
  .type __thumb_startup, %function
__thumb_startup:
/* Call the C hardware init function (which also has to switch off the watchdog) */
  bl  __init_hardware

/* Copy the data segment initializers from flash to SRAM: */
  movs r1, #0
  b LoopCopyDataInit

CopyDataInit:
  ldr r3, =___ROM_AT
  ldr r3, [r3, r1]
  str r3, [r0, r1]
  adds r1, r1, #4

LoopCopyDataInit:
  ldr r0, =_sdata
  ldr r3, =_edata
  adds r2, r0, r1
  cmp r2, r3
  bcc CopyDataInit
  ldr r2, =__START_BSS
  b LoopFillZerobss

/* Zero fill the bss segment: */
FillZerobss:
  movs r3, #0
  str r3, [r2]
  adds r2, r2, #4

LoopFillZerobss:
  ldr r3, = __END_BSS
  cmp r2, r3
  bcc FillZerobss
/* Call the application's entry point: */
  bl main
  blx r0   /*Call the startup code of the application (address returned by the main() function of the boot loader)*/
  bx lr
.size __thumb_startup, .-__thumb_startup

/****END OF FILE****/
